
typedef void EventCallBack(arg);

// 全局变量
final bus = EventBus();

class EventBus {
  // 私有构造函数
  EventBus._internal();

  // 保存单例
  static EventBus _singleton = new EventBus._internal();

  // 工厂构造函数
  factory EventBus() => _singleton;

  // 保存时间订阅者队列，key：事件名(id)，value：对应事件的订阅者队列
  var _emap = new Map<Object, List<EventCallBack>>();

  // 添加订阅者
  void on(eventName,EventCallBack f) {
    if (eventName == null || f == null) return;
    _emap[eventName] ??= new List<EventCallBack>();
    _emap[eventName].add(f);
    print("bus on event,event name is : $eventName");
  }

  // 移除订阅者
  void off(eventName,[EventCallBack f]) {
    var list = _emap[eventName];
    if (eventName == null || list == null) return;
    if (f == null) {
      _emap[eventName] = null;
    } else {
      list.remove(f);
    }
    print("bus off event,event name is : $eventName");
  }

  void emit(eventName,[arg]) {
    print("bus emit event,event name is : $eventName");
    var list = _emap[eventName];
    if (list == null) return;
    int len = list.length - 1;
    for (var i = len;i > -1; --i){
      list[i](arg);
    }
  }
}